import pygame
from pygame.locals import*
from sys import exit
from Bomba import *
from Alpha import *
import time
import random

def frames(lista):
    if len(lista) != 0:
        lista.insert(0, lista.pop())
    return lista

class PersonagemColisao(pygame.sprite.Sprite):
    def __init__(self, x, y, num_vidas):
        pygame.sprite.Sprite.__init__(self)
        self.rect = pygame.Rect(x, y, 30, 30)
        self.rect.top = y
        self.rect.left = x
        self.esta_vivo = True
        self.orientacao = ''
        self.pode_chutar_bombas = False
        self.num_bombas = 1
        self.potencia_bomba = 1
        self.velocidade = 6
        self.bomba_relogio = False
        self.estado = 'vivo'
        self.numero_vidas = num_vidas
        self.tipo_morte = ''
        self.invulneravel = True
        self.score = 0
        self.grupo = pygame.sprite.RenderPlain(self)
        self.max_bombas = 1

    def solta_bomba(self, boomColide, bombaGrupo, relogio):
        Bomba(boomColide, bombaGrupo, relogio)

    def morte(self, bombaGrupo, boom, screen):
        for bomba in bombaGrupo:
            if self in pygame.sprite.groupcollide(self.grupo, bomba.grupo_explosao, 0, 0):
                self.esta_vivo = False
                self.numero_vidas -= 1
                if self.numero_vidas <= 0:
                    self.numero_vidas = 0
                    self.estado = 'morto'
                if self.score <= 0:
                    self.score = 0
                self.invulneravel = True

    def morte_por_monstro(self, boom, monstroColideGrupo, frame_morte):
        for monstroColide in monstroColideGrupo:
            dic = pygame.sprite.groupcollide(self.grupo, monstroColideGrupo, 0, 0)
            if self.esta_vivo and self in dic and dic[self][0].esta_vivo:
                self.esta_vivo = False
                for imagem in frame_morte:
                    boom.image = pygame.image.load(imagem)
                self.numero_vidas -= 1
                if self.numero_vidas <= 0:
                    self.numero_vidas = 0
                    self.estado = 'morto'
                if self.score <= 0:
                    self.score = 0
                self.invulneravel = True

class Personagem(pygame.sprite.Sprite):
    def __init__(self, x = 0, y = 0, img = ''):
        pygame.sprite.Sprite.__init__(self)
        self.img = img
        self.image  = pygame.image.load(self.img)
        self.indice_img_morte = 0
        self.rect = self.image.get_rect()
        self.rect.left = x
        self.rect.top = y
        self.orientacao = ''
        self.grupo = pygame.sprite.RenderPlain(self)

    def move(self, event, paredeGrupo, boomColide, bombaGrupo, frame_direita, frame_esquerda, frame_descendo, frame_subindo):
        contador = 0
        altera_abcissa = 0
        arredonda_abcissa = 0
        altera_ordenada = 0
        pygame.key.get_pressed()[K_UP]
        if pygame.key.get_pressed()[K_LEFT]:
            boomColide.orientacao = 'esquerda'
            altera_abcissa -= boomColide.velocidade
            for imagem in frames(frame_esquerda):
                self.image  = pygame.image.load(imagem)
        if pygame.key.get_pressed()[K_RIGHT]:
            boomColide.orientacao = 'direita'
            altera_abcissa += boomColide.velocidade
            for imagem in frames(frame_direita):
                self.image  = pygame.image.load(imagem)
        if pygame.key.get_pressed()[K_UP] == 1:
            boomColide.orientacao = 'cima'
            altera_ordenada -= boomColide.velocidade
            for imagem in frames(frame_subindo):
                self.image  = pygame.image.load(imagem)
        if pygame.key.get_pressed()[K_DOWN] == 1:
            boomColide.orientacao = 'baixo'
            altera_ordenada += boomColide.velocidade
            for imagem in frames(frame_descendo):
                self.image  = pygame.image.load(imagem)
    
        self.rect.top += altera_ordenada
        self.rect.left += altera_abcissa
        boomColide.rect.top += altera_ordenada
        boomColide.rect.left += altera_abcissa

        for bomba in bombaGrupo:
            if (abs(boomColide.rect.top - bomba.rect.top) >= 30) or (abs(boomColide.rect.left - bomba.rect.left) >= 30):
                bomba.deve_colidir = True
            elif bomba.deve_colidir and boomColide in pygame.sprite.groupcollide(boomColide.grupo, bombaGrupo, 0, 0):
                self.rect.top -= altera_ordenada
                self.rect.left -= altera_abcissa
                boomColide.rect.top -= altera_ordenada
                boomColide.rect.left -= altera_abcissa

        if boomColide in pygame.sprite.groupcollide(boomColide.grupo, paredeGrupo, 0, 0):
            self.rect.top -= altera_ordenada
            self.rect.left -= altera_abcissa
            boomColide.rect.top -= altera_ordenada
            boomColide.rect.left -= altera_abcissa

class MonstroColisao(pygame.sprite.Sprite):
    def __init__(self, x, y, monstroColideGrupo, num_vidas):
        pygame.sprite.Sprite.__init__(self)
        self.rect = pygame.Rect(x, y, 30, 30)
        self.rect.top = y
        self.rect.left = x
        self.esta_vivo = True
        self.indice_imagem_morte = 0
        self.num_vidas = num_vidas
        self.velocidade = 5
        self.movimentacao = 'cima'
        self.ja_andou = 0 # marca quanto o monstro ja andou desde a ultima vez que decidiu mudar ou nao de direcao
        monstroColideGrupo.add(self)

    def move(self, monstro, monstroColideGrupo, paredeGrupo, bombaGrupo, monster_frames_direita, monster_frames_esquerda, monster_frames_subindo, monster_frames_descendo, monster_frames_morte):
        altera_abcissa = 0
        altera_ordenada = 0
        if self.movimentacao == 'cima':
            altera_ordenada -= self.velocidade
            for imagem in frames(monster_frames_subindo):
                monstro.image  = pygame.image.load(imagem)
        elif self.movimentacao == 'baixo':
            altera_ordenada += self.velocidade
            for imagem in frames(monster_frames_descendo):
                monstro.image  = pygame.image.load(imagem)
        elif self.movimentacao == 'direita':
            altera_abcissa += self.velocidade
            for imagem in frames(monster_frames_direita):
                monstro.image  = pygame.image.load(imagem)
        elif self.movimentacao == 'esquerda':
            altera_abcissa -= self.velocidade
            for imagem in frames(monster_frames_esquerda):
                monstro.image  = pygame.image.load(imagem)

        self.rect.top += altera_ordenada
        monstro.rect.top += altera_ordenada
        self.rect.left += altera_abcissa
        monstro.rect.left += altera_abcissa
        self.ja_andou += (altera_ordenada + altera_abcissa)

        grupoAuxiliar = monstroColideGrupo.copy()
        grupoAuxiliar.remove(self)
        if self in pygame.sprite.groupcollide(monstroColideGrupo, paredeGrupo, 0, 0) or self in pygame.sprite.groupcollide(monstroColideGrupo, grupoAuxiliar, 0, 0) or self in pygame.sprite.groupcollide(monstroColideGrupo, bombaGrupo, 0, 0):
            self.rect.top -= altera_ordenada
            self.rect.left -= altera_abcissa
            self.ja_andou -= (altera_ordenada + altera_abcissa)
            monstro.rect.top -= altera_ordenada
            monstro.rect.left -= altera_abcissa
            if self.movimentacao == 'cima':
                self.movimentacao = 'baixo' 
            elif self.movimentacao == 'baixo':
                self.movimentacao = 'cima' 
            elif self.movimentacao == 'direita':
                self.movimentacao = 'esquerda' 
            elif self.movimentacao == 'esquerda':
                self.movimentacao = 'direita' 

    def decide_direcao(self):
        if self.ja_andou % 60 == 0:
            lista = ['direita', 'esquerda', 'cima', 'baixo']
            lista_direcoes = lista[::]
            lista_direcoes.remove(self.movimentacao)
            nova_direcao = random.choice(lista_direcoes)
            self.movimentacao = nova_direcao
            self.ja_andou = 0

    def morte(self, monstroColideGrupo, monstro, bombaGrupo, boomColide):
        if self.esta_vivo:
            for bomba in bombaGrupo:
                if self in pygame.sprite.groupcollide(monstroColideGrupo, bomba.grupo_explosao, 0, 0):
                    self.num_vidas -= 1
                    boomColide.score += 250

class Monstro(pygame.sprite.Sprite):
    def __init__(self, x, y, monstroGrupo, img):
        pygame.sprite.Sprite.__init__(self)
        self.image  = pygame.image.load(img)
        self.rect = self.image.get_rect()
        self.rect.left = x
        self.rect.top = y
        monstroGrupo.add(self)

def instanciacaoMonstros(monstroGrupo, monstroColideGrupo, quant_monstros, num_vidas, imagem):
    dicMonstros = {}
    for monstroColide in range(quant_monstros):
        pos = acha_pos_monstro()
        for monstroColide in dicMonstros:
            if (monstroColide.rect.left, monstroColide.rect.top) == pos:
                pos = acha_pos_monstro()
        while pos == (30,30) or pos == (30,60) or pos == (60,30) or pos == (570,450) or pos == (570,420) or pos == (530,450):
            pos = acha_pos_monstro()
        monstroColide = MonstroColisao(pos[0], pos[1], monstroColideGrupo, num_vidas)
        monstro = Monstro(pos[0], (pos[1] - 30), monstroGrupo, imagem)
        dicMonstros[monstroColide] = monstro
    return dicMonstros
